package anr.desu.pmo.proyecto.model.dao.jpa;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TemporalType;

import anr.desu.pmo.proyecto.model.Proyecto;
import anr.desu.pmo.proyecto.model.dao.ProyectoDAO;

public class JPAProyectoDAO implements ProyectoDAO {

	private EntityManager em;
	
	public JPAProyectoDAO(EntityManager em){
		this.em=em;
	}
	
	@Override
	public List<Proyecto> findAll() {
		Query query=em.createQuery("Select o From Proyecto o order by o.idproyecto");
		return query.getResultList();
	}

	@Override
	public List<Proyecto> findByUsuario(Integer id) throws Exception {
		Query query=null;
		try {
			query=em.createQuery("Select o From Proyecto o Where o.idempleado=?1 order by o.idproyecto");
			query.setParameter(1, id);
			return query.getResultList();
		}catch (Exception e) {
			System.out.println("mensaje: "+e.getMessage());
			return null;
		}
	} 
	
	@Override
	public List<Proyecto> findByJefe(Integer id) throws Exception {
		Query query=null;
		try {
			query=em.createQuery("Select o From Proyecto o Where (o.empleado.idempleado=?1 OR " +
					" o.empleado.idempleado = ANY(Select u.idempleado From Empleado u Where u.jefe.idempleado=?1)) " +
					" Order by o.idproyecto");
			query.setParameter(1, id);
			return query.getResultList();
		} catch (Exception e) {
			System.out.println("mensaje: "+e.getMessage());
			return null;
		}
	} 

	@Override
	public Proyecto findById(Integer id) {
		Query query=em.createQuery("Select o From Proyecto o Where o.idproyecto=?1");
		query.setParameter(1, id);
		return (Proyecto)query.getSingleResult();
	}

	@Override
	public Proyecto insert(Proyecto o) {
		em.persist(o);
		return o;
	}

	@Override
	public void update(Proyecto o) {
		em.merge(o);
	}

	@Override
	public void delete(Integer id) {
		Proyecto remove=em.find(Proyecto.class, id);
		em.remove(remove);
	}

	@Override
	public Integer findIdMayor() {
		Query query=em.createQuery("Select max(o.idproyecto) From Proyecto o");
		return (Integer)query.getSingleResult();
	}

	@Override
	public Proyecto findByCodProyecto(String codproyecto) {
		Proyecto proyecto=em.find(Proyecto.class, codproyecto);
		return proyecto;
	}

	@Override
	public Proyecto findByIdEntregable(Integer identregable) {
		Query query = null;
		try {
			query=em.createQuery("SELECT proy FROM Proyecto proy, Entregable ent" +
					" WHERE ent.identregable = ?1 and ent.proyecto.idproyecto = proy.idproyecto");
			query.setParameter(1, identregable);
			return (Proyecto)query.getSingleResult();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			System.out.println(query.getSingleResult().toString());
			return null;
		}
	}

	@Override
	public List<Proyecto> findByCriterio(Proyecto proyecto) {
		Query query=null;
		try {
			query=em.createQuery("Select o From Proyecto o Where" +
					" o.descripcion like ?1 AND" +
					" o.fecInicioPresup >= ?2 AND " +
					" o.fecFinPresup <= ?3 AND " +
					" o.empleado.nombre like ?4 AND " +
					" o.empleado.apepaterno like ?5 AND " +
					" o.empleado.apematerno like ?6 AND " +
					" o.tipoEstado.descripcion like ?7 AND " +
					" o.area.sigla like ?8");
			
			query.setParameter(1, "%"+proyecto.getDescripcion()+"%");
			query.setParameter(2, proyecto.getFecInicioPresup(),TemporalType.TIMESTAMP);
			query.setParameter(3, proyecto.getFecFinPresup(),TemporalType.TIMESTAMP);
			if(proyecto.getEmpleado().getIdempleado() == null){
				query.setParameter(4, "%%");
				query.setParameter(5, "%%");
				query.setParameter(6, "%%");
			}else{
				query.setParameter(4, proyecto.getEmpleado().getNombre());
				query.setParameter(5, proyecto.getEmpleado().getApepaterno());
				query.setParameter(6, proyecto.getEmpleado().getApematerno());
			}
			if(proyecto.getTipoEstado().getIdtipoestado() == null){
				query.setParameter(7, "%%");
			}else{
				query.setParameter(7, proyecto.getTipoEstado().getDescripcion());
			}
			if(proyecto.getArea().getIdarea() == null){
				query.setParameter(8, "%%");
			}else{
				query.setParameter(8, proyecto.getArea().getSigla());
			}
			return query.getResultList();
		}catch (Exception e) {
			System.out.println("mensaje: "+e.getMessage());
			System.out.println("mensaje: "+e.getCause());
			return null;
		}
	}
}
